弹球注解


#!/usr/bin/env python3
#导入py包
#  gt 包是还原终端的未被修改过的状态和回归到当前状态，启动函数的工具包
#  random 包是导入随机函数的包
#  os 是系统包，获取系统路径还有名字，以及执行一些关于系统的文件
import gt
import random
import os

def show_bg():
    """
    展示画布，画布是长为W，宽为H的，由‘#’围成的一个矩形
    """
    print("\033[1;1H", end='', flush=True)

    for r in range(H):
        for c in range(W):
            ch = '#' if r == 0 or c == 0 or r == H - 1 or c == W - 1 else ' '
            print(ch, end='', flush=True)
        print(flush=True)

def ball_init():
    """
    游戏终端的初始化：还原终端为不等待enter键刷新行缓存区
    """
    print("\033[2J\033[?25l", end='', flush=True)
    gt.init()
    gt.run(move)


def ball_exit():
    """
    游戏终端的退出：还原终端为等待enter键刷新行缓存区（以前的状态）
    """
    print("\033[?25h\033[%d;1H" % (H + 2), flush=True)
    gt.exit()
    #在杀死程序之前需要等待gt.exit()执行结束
    gt.sleep(0.1)
    os.kill(0, 15)

def ball_rebound():

    global x, y, direct

    if x == W - 1:
        direct = 1
    elif x == 2:
        direct = 0
    elif y == H - 1:
        direct = 2
    elif y == 2:
        direct = 3

def move():
    """
    游戏开始：通过移动规则进行游戏
    """
    global x, y, direct, flag

    while flag:
        show_bg()

        #刷新终端
        print("\033[%d;%dH\033[%dm@\033[0m" % (y, x, color), end='', \
                flush=True)

        #触碰到边界则结束游戏
        #  if x == 1 or y == 1 or x == W - 1 or y == H - 1:
            #  ball_exit()

        #触碰到边界则反弹
        ball_rebound()

        if direct == 0:
            x += 1
        elif direct == 1:
            x -= 1
        elif direct == 2:
            y -= 1
        elif direct == 3:
            y += 1

        gt.sleep(0.001)

def controller():
    """
    键盘控制函数：键入q结束游戏，wsad分别控制上下左右方向，空格控制颜色
    """
    global direct, color, flag

    while True:
        ch = gt.get()
        if ch == 'q':
            flag = False
            break
        elif ch == 'w':
            direct = 2
        elif ch == 's':
            direct = 3
        elif ch == 'a':
            direct = 1
        elif ch == 'd':
            direct = 0
        elif ch == ' ':
            color = random.randint(30, 37)


#设置画布的大小
H = 15
W = 50

#设置默认的颜色
color = 31

#设置默认的开始的地方以及方向
y = 3
x = 3
direct = 0
#设置move执行循环的默认值为True
flag=True

#打印画布的长和宽101,59
print("%d, %d" % (gt.w(), gt.h()))
#打印：(101,59)
print(gt.size())
#阻塞，等待用户输入enter键之后开始执行此后的代码（输入任何键都无效）
input()

ball_init()

controller()

ball_exit()

